package listnode;


public class 移除链表元素203 {

    /**
     * 添加虚节点方式
     * 时间复杂度 O(n)
     * 空间复杂度 O(1)
     *
     * @param head
     * @param val
     * @return
     */
//    public ListNode removeElements(ListNode head, int val) {
//        if (head == null) {
//            return head;
//        }
//
//        // 因为删除可能涉及到头节点，所以设置dummy节点，统一操作
//        ListNode dummy = new ListNode(-1, head);
//        ListNode pre = dummy;
//        ListNode cur = head;
//        while (cur != null) {
//            if (cur.val == val) {
//                pre.next = cur.next;
//            } else {
//                pre = cur;
//            }
//            cur = cur.next;
//        }
//        return dummy.next;
//    }

    /**
     * 不添加虚拟节点方式
     * 时间复杂度 O(n)
     * 空间复杂度 O(1)
     * @param head
     * @param val
     * @return
     */
    public static ListNode removeElements(ListNode head, int val) {
        // 删除节点，指向下一个节点
        while (head != null && head.val == val) {
            head = head.next;
        }

        // 已经为null，提前退出
        if (head == null) {
            return head;
        }

        // TODO 已确定当前head.val != val
        ListNode pre = head;
        ListNode cur = head.next;
        while (cur != null) {
            if (cur.val == val) {
                pre.next = cur.next;
            } else {
                pre = cur;
            }
            cur = cur.next;
        }
        return head;
    }
}
